/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.awt.print.PrinterException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarMensaje;
import pe.com.cotelasa.helper.VentaFacturacionPrintHelper;
import pe.com.cotelasa.scp.controlador.backingBean.BKControlDrawback;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaFacturaExportacion;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.TIPO_FORMA_PAGO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioNumeroALetras;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioDetallePedidoOp;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoFormaPago;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDetalleFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetallePedidoOp;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.scp.entidad.TipoFormaPago;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.TipoUnidadMinima;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacion;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacionPK;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaLineaCredito;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBVentaFacturaExportacion")
@Scope("request")
public class MBVentaFacturaExportacion extends MBGenerico implements IMantenedor, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaFacturaExportacion.class);
    @Inject
    private BKVentaFacturaExportacion bk;
    @Inject
    private BKControlDrawback bkControl;
    @Inject
    private IServicioTipoFormaPago servicioTipoFormaPago;
    @Inject
    private IServicioVentaFacturacion servicioVentaFacturacion;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioVentaDetalleFacturacion servicioVentaDetalleFacturacion;
    @Inject
    private IServicioOrdenPedido servicioOrdenPedido;
    @Inject
    private IServicioDetallePedidoOp servicioDetalleOP;
    @Inject
    private IServicioTipoMoneda servicioMoneda;
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private IServicioGuiaRemision servicioGR;
    @Autowired
    BKSession session;

    public void buscarListaFacturas() {
        try {
            System.out.println("entro a buscar lista");
            bk.setListaFacturas(servicioVentaFacturacion.obtenerVentaFacturacionBusqueda(
                    bk.getFacturaBusqueda(), bk.getBusquedaDel(), bk.getBusquedaAl()));
            System.out.println("");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrar() {
        System.out.println("entrar a la factura expo");
        VentaFacturacion documento = new VentaFacturacion();
        documento.setRazon("");
        documento.setRuc("");
        documento.setNumFactura("");
        documento.setTipoCompago(TIPO_DOC_VENTA.FACTURA_EXPORTACION.getValor());
        documento.setFormaPago(new TipoFormaPago(0));

        bk.setFacturaBusqueda(documento);
        bk.setBusquedaDel(null);
        bk.setBusquedaAl(null);
        bk.setListaFacturas(null);
        bkControl.setFacturaBusqueda(new VentaFacturacion());
        bkControl.getFacturaBusqueda().setFechDocventa(new Date());
        bkControl.getFacturaBusqueda().setOrdenPedido(new OrdenPedido());

        try {
            bk.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
        } catch (ServiceException e) {
            e.printStackTrace();
        }

        return URLPaginacion.Ventas.URL_LISTA_FACTURA_EXPORTACION;
    }

    @Override
    public String nuevo() {
        bk.setComando(new ComandoGuardar(this));
        try {
            //cargar correlativo

            VentaFacturacion documento = new VentaFacturacion();
            documento.setDatosDestina("");
            documento.setDomiPartida("");
            documento.setNOcliente("");
            documento.setGuiaRem("");
            documento.setDomiLlegada("");
            documento.setFechEntrega(new Date());
            documento.setFechDocventa(new Date());
            documento.setFormaPago(new TipoFormaPago(0));
            documento.setOrdenPedido(new OrdenPedido(0));
            documento.setAplicarDrawback(new Short("1"));
            //documento.setFechVencimiento(new Date());
            documento.setTipoCompago(TIPO_DOC_VENTA.FACTURA_EXPORTACION.getValor());
            documento.setEstado(COLOR_ESTADO_VENTA.CREADA.getEstado());
            documento.setSede(session.getSede());
            documento.setValorCFR(0.0);
            documento.setValorCIF(0.0);
            OrdenPedido ordenp = new OrdenPedido();
            ordenp.setEstadoPedido("E");
            ordenp.setIdEmpresa(session.getEmpresa());
            bk.setListaOrdenesPedido(servicioOrdenPedido.listarOrdenesPedidoPorEstado(ordenp));
            bk.setListaGuiaRemisionElegir(new ArrayList<GuiaRemision>());
            List<TipoCambio> lista = (List<TipoCambio>) servicioTipoCambio.listarTipoCambiosPorFiltro(new Date(), new Date());
            if (lista.isEmpty()) {
                mostrarError("Ingresar el Tipo de Cambio del día de hoy");
                return URLPaginacion.Ventas.URL_LISTA_FACTURA_EXPORTACION;
            } else {
                documento.setTipoCambio(lista.get(0).getVenta().doubleValue());

            }

            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_FACTURA_EXPORTACION);
            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            correlativo.setIdsede(session.getSede());
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            bk.setListaCorrelativos(servicioCorrelativo.listarCorrelativoPorDocumentoYSede(correlativo));

            for (ParametroDetalle param : servicioParametro.listaTipoMotivoGuia()) {

                if (param.getValCadena().equalsIgnoreCase("VENTA")) {
                    documento.setMotTraslado(param.getId());
                }
            }

            bk.setFacturaFormulario(documento);
            //bk.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
            //bk.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bk.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());

            /*bk.setIdTipoMotivo(0);
             bk.setIdTipoMoneda(0);*/



        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_FACTURA_EXPORTACION;
        }
        return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA_EXPORTACION;
    }

    @Override
    public String editar() {
        bk.setComando(new ComandoActualizar(this));
        try {
            bk.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            bk.setFacturaFormulario(servicioVentaFacturacion.obtenerFacturacion(bk.getFacturaSeleccionado().getCoddocventa()));
            bk.setNumero(bk.getFacturaFormulario().getSerieFactura().concat(bk.getFacturaFormulario().getNumFactura()));
            bk.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            System.out.println("orden de pedido: " + bk.getFacturaFormulario().getOrdenPedido().getCodigoOrdenPedido());
            bk.setListaDetalleFacturacion(servicioVentaDetalleFacturacion.obtenerVentaDetalleFacturacion(bk.getFacturaFormulario().getCoddocventa()));
            actualizarEstado();

            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA_EXPORTACION;
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_FACTURA_EXPORTACION;
        }
    }

    @Override
    public String guardar() {
        boolean flag = true;
        try {
            flag = servicioVentaFacturacion.esNumeroDocCorrecta(bk.getFacturaFormulario());

            if (flag) {
                mostrarError("El número de Factura ya ha sido registrado.");
                return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
            }

            bk.getFacturaFormulario().setVendedor(session.getUsuario().getId());
            bk.getFacturaFormulario().setPorCobrar(bk.getFacturaFormulario().getPrecioVenta());
            bk.getFacturaFormulario().setFecCreacion(new Date());
            bk.getFacturaFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bk.getFacturaFormulario().setFormaPago(servicioTipoFormaPago.conseguirTipoFormaPagoPorNombre(bk.getFacturaFormulario().getFormaPago().getNombre()));
            bk.getFacturaFormulario().setNumFactura(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bk.getFacturaFormulario().getNumFactura())));
            if (bk.getFacturaFormulario().getFechVencimiento() == null) {
                bk.getFacturaFormulario().setFechVencimiento(new Date());
            }

            ResultadoServicio rs = servicioVentaFacturacion.guardarVentaFacturacion(bk.getFacturaFormulario());
            Integer ID = (Integer) rs.getID();

            for (GuiaRemision guia : bk.getListaGuiaRemisionElegido()) {

                guia.setIdVentaFacturacion(ID);
                guia.setUsrModificacion(session.getUsuario().getUsuario());
                guia.setFecModificacion(new Date());
                servicioGR.actualizarGuiaDeRemision(guia);
            }

            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_FACTURA_EXPORTACION);

            //String format = "%1$08d";
            Integer numero = Integer.parseInt(bk.getFacturaFormulario().getNumFactura()) + 1;
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            correlativo.setIdsede(session.getSede());
            correlativo.setSerie(bk.getFacturaFormulario().getSerieFactura());
            CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoTipoDocSede1(correlativo);

            if (numero > Integer.parseInt(correlativoEncontrado.getNumero())) {
                correlativoEncontrado.setNumero(UtilitarioCadenas.formatoNumeroDocumento(numero));
                servicioCorrelativo.actualizarCorrelativoDocumento(correlativoEncontrado);
            }
            //guardamos el detalle
            int num_factura = 1;
            for (VentaDetalleFacturacion detalle : bk.getListaDetalleFacturacion()) {
                detalle.setVentaDetalleFacturacionPK(new VentaDetalleFacturacionPK(num_factura, ID));
                detalle.setFecCreacion(new Date());
                detalle.setUsrCreacion(session.getUsuario().getUsuario());
                servicioVentaDetalleFacturacion.guardarVentaDetalleFacturacion(detalle);
                num_factura++;
            }
            mostrarMensaje("Se guardó la Factura satisfactoriamente.");
            bk.setFacturaSeleccionado(bk.getFacturaFormulario());
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
        }
    }

    @Override
    public String actualizar() {
        try {
            bk.getFacturaFormulario().setVendedor(session.getUsuario().getId());
            bk.getFacturaFormulario().setFecModificacion(new Date());
            bk.getFacturaFormulario().setUsrModificacion(session.getUsuario().getUsuario());
            if (bk.getFacturaFormulario().getFechVencimiento() == null) {
                bk.getFacturaFormulario().setFechVencimiento(new Date());
            }
            servicioVentaFacturacion.actualizarVentaFacturacion(bk.getFacturaFormulario());
            List<VentaDetalleFacturacion> listaAux = new ArrayList<VentaDetalleFacturacion>();
            for (VentaDetalleFacturacion detalle : bk.getListaDetalleFacturacion()) {
                listaAux.add(detalle);
            }

            servicioVentaFacturacion.eliminarDetalleFactura(bk.getFacturaFormulario().getCoddocventa());


            //guardamos el detalle
            int num_factura = 1;
            for (VentaDetalleFacturacion detalle : listaAux) {
                detalle.setVentaDetalleFacturacionPK(new VentaDetalleFacturacionPK(num_factura, bk.getFacturaFormulario().getCoddocventa()));
                detalle.setFecCreacion(new Date());
                detalle.setUsrCreacion(session.getUsuario().getUsuario());
                servicioVentaDetalleFacturacion.guardarVentaDetalleFacturacion(detalle);
                num_factura++;
            }
            mostrarMensaje("Se actualizó la Factura satisfactoriamente.");
            bk.setFacturaSeleccionado(bk.getFacturaFormulario());
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
        }
    }

    @Override
    public String ver() {
        editar();
        System.out.println("orden de pedido: " + bk.getFacturaFormulario().getOrdenPedido().getCodigoOrdenPedido());
        return URLPaginacion.Ventas.URL_VER_FACTURA_EXPORTACION;
    }

    public String imprimir() throws ServiceException {

        if (!VentaFacturacionPrintHelper.verificarImpresora(session.getSede().getRecursoImpresora())) {
            mostrarError("No se pudo conectar con la impresora");
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA_EXPORTACION;
        }


        bk.getFacturaFormulario().setEstado(COLOR_ESTADO_VENTA.EMITIDO.getEstado());

        if (bk.getComando().getNombre().equalsIgnoreCase("Actualizar")) {
            actualizar();
        } else {
            guardar();
        }
        
        if (bk.getFacturaFormulario().getCoddocventa() == null) {
            mostrarError("Error al guardar el formulario. Verifique que los datos sean correctos.");
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA_EXPORTACION;
        }
        
        try {
            
            
            VentaFacturacionPrintHelper.imprimirFacturaExportacion(bk.getFacturaFormulario(), servicioOrdenPedido.conseguirOrdenPedidoPorId(bk.getFacturaFormulario().getOrdenPedido().getId()).getCodigoOrdenPedido() , bk.getListaDetalleFacturacion() , session.getSede().getRecursoImpresora());
            mostrarMensaje("Se lanzó la impresión satisfactoriamente.");
        } catch (PrinterException e) {
            e.printStackTrace();
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA_EXPORTACION;
        }
        
        return ver();
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void buscarNumDoc() {
        for (CorrelativoDocumento correlativo : bk.getListaCorrelativos()) {
            if (correlativo.getSerie().equalsIgnoreCase(bk.getFacturaFormulario().getSerieFactura())) {
                bk.getFacturaFormulario().setNumFactura(correlativo.getNumero());
            }
        }
    }

    public void elegirOP() {

        if (bk.getFacturaFormulario().getOrdenPedido() != null && bk.getFacturaFormulario().getOrdenPedido().getId() != 0) {

            try {
                bk.getFacturaFormulario().setOrdenPedido(
                        servicioOrdenPedido.conseguirOrdenPedidoPorId(bk.getFacturaFormulario().getOrdenPedido().getId()));
                bk.getFacturaFormulario().setMoneda(servicioMoneda.buscarMonedaPorNombre(bk.getFacturaFormulario().getOrdenPedido().getTipoMoneda()));

                Cliente cliente = bk.getFacturaFormulario().getOrdenPedido().getIdCliente();
                bk.getFacturaFormulario().setCodCliente(cliente);
                bk.getFacturaFormulario().setRuc(cliente.getNumeroDocumento());
                bk.getFacturaFormulario().setRazon(cliente.getRazonSocial());
                bk.getFacturaFormulario().setDireccion(cliente.getDireccionLegal());
                if (!bk.getFacturaFormulario().getGuiaRem().equalsIgnoreCase("")) {
                    bk.getFacturaFormulario().setGuiaRem("");
                    bk.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());


                    bk.getFacturaFormulario().setValorVenta(null);
                    bk.getFacturaFormulario().setIgv(null);
                    bk.getFacturaFormulario().setPrecioVenta(null);
                    bk.getFacturaFormulario().setValorLetras("");
                }

                bk.getFacturaFormulario().setCodCliente(bk.getFacturaFormulario().getOrdenPedido().getIdCliente());

                Hibernate.initialize(bk.getFacturaFormulario().getOrdenPedido());
            } catch (ServiceException e) {
                logger.error(e.getMessage(), e);
                mostrarError("Ocurrio un error al cargar la informacion.");
            }
            cargarGuias();

        }

    }

    public void cargarGuias() {
        //bk.setVentaFacturacionBusqueda(new VentaFacturacion());
        try {
            GuiaRemision guiaBusqueda = new GuiaRemision();
            /*guiaBusqueda.setTipoCompago(TIPO_DOC_VENTA.GUIA.getValor());
             guiaBusqueda.setRuc("");
             guiaBusqueda.setRazon("");*/
            guiaBusqueda.setIdEmpresa(session.getEmpresa());
            guiaBusqueda.setOrdenPedido(bk.getFacturaFormulario().getOrdenPedido());

            for (ParametroDetalle parametro : servicioParametro.listaTipoMotivoGuia()) {
                if (parametro.getValCadena().equalsIgnoreCase("EXPORTACION")) {
                    guiaBusqueda.setParametroMotivoGuia(parametro);
                    break;
                }
            }
            System.out.println("");
            bk.setListaGuiaRemisionElegir(servicioGR.obtenerGuiaExportacionPorOP(guiaBusqueda));

            System.out.println("lista de guias: " + bk.getListaGuiaRemisionElegir());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void cambiarGuia() {
        bk.getFacturaFormulario().setGuiaRem("");
        bk.getListaDetalleFacturacion().clear();
    }

    public void llenarDetalle() {
        try {

            bk.setListaGuiaRemisionElegido(new ArrayList<GuiaRemision>());
            String guias = "";
            List<DetalleGuiaRemision> lista = new ArrayList<DetalleGuiaRemision>();
            for (String id : bk.getListaGuiaSeleccionadas()) {
                GuiaRemision encontrado = servicioGR.conseguirGuiaDeRemisionPorId(Integer.parseInt(id));
                System.out.println("guia encontrada: " + encontrado.getSerie() + "-" + encontrado.getNumeroGuia());

                lista.addAll(encontrado.getDetalleGuiaRemisions());
                bk.getListaGuiaRemisionElegido().add(encontrado);
                guias += encontrado.getSerie() + "-" + encontrado.getNumeroGuia() + " , ";
            }
            guias = guias.substring(0, guias.length() - 3);
            bk.getFacturaFormulario().setGuiaRem(guias);

            boolean encontro = false;
            TipoUnidadMinima unidad = new TipoUnidadMinima();
            double cantidad;
            for (DetallePedidoOp detalle : servicioDetalleOP.conseguirDetallesPorOp(bk.getFacturaFormulario().getOrdenPedido().getId())) {
                System.out.println("detalle de op: " + detalle.getIdArticulo().getNombreComercial());
                encontro = false;
                cantidad = 0.0;
                for (DetalleGuiaRemision detalleGuia : lista) {

                    if (detalleGuia.getEstadoRegistro().equalsIgnoreCase("" + ESTADO_REGISTRO.ACTIVO.getValor())
                            && detalle.getIdArticulo().getId().equals(detalleGuia.getArticulo().getId())) {
                        //System.out.println("encontrooo detalle: ");
                        cantidad += detalleGuia.getCantidad().doubleValue();
                        unidad = detalleGuia.getTipoUnidadMinima();
                        encontro = true;
                    }

                }
                if (encontro) {
                    VentaDetalleFacturacion detalleFactura = new VentaDetalleFacturacion();
                    detalleFactura.setCantidad(cantidad);
                    detalleFactura.setPrecUnitario(detalle.getPrecioUnitario().doubleValue());
                    detalleFactura.setCodarticulo(detalle.getIdArticulo());
                    detalleFactura.setTotal(cantidad * detalleFactura.getPrecUnitario());
                    detalleFactura.setUnidad(unidad);
                    detalleFactura.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                    detalleFactura.setDescProducto(detalle.getIdArticulo().getModelo() + ", " + detalle.getIdArticulo().getDetalle());
                    bk.getListaDetalleFacturacion().add(detalleFactura);
                    //System.out.println("lista de ");
                }

            }



            double total = 0.0;
            double subtotal = 0.0;
            double igv = 0.0;
            for (VentaDetalleFacturacion detallev : bk.getListaDetalleFacturacion()) {
                total = total + detallev.getTotal();
            }

            bk.getFacturaFormulario().setIgvPorcentaje(servicioIgv.ConseguirIgvVigente().getMonto().doubleValue());

            igv = bk.getFacturaFormulario().getIgvPorcentaje() * total / 100;
            subtotal = total - igv;

            bk.getFacturaFormulario().setValorVenta(subtotal);
            bk.getFacturaFormulario().setIgv(igv);
            bk.getFacturaFormulario().setPrecioVenta(total);

            calcularTotales();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }


    }

    public void convertirALetra() {
        if (bk.getFacturaFormulario().getPrecioVenta() != null) {
            UtilitarioNumeroALetras valorLetras = new UtilitarioNumeroALetras();
            bk.getFacturaFormulario().setValorLetras(valorLetras.Convertir(String.valueOf(bk.getFacturaFormulario().getTotalExportacion()), true,
                    bk.getFacturaFormulario().getMoneda().getNombre()));
        }

    }

    public void elegirFormaPago() {
        try {
            System.out.println("forma de pago: " + bk.getFacturaFormulario().getFormaPago().getNombre());
            if (bk.getFacturaFormulario().getFormaPago().getNombre() != null) {

                bk.setListaTipoPago(new ArrayList<String>());
                for (ParametroDetalle param : servicioParametro.listarTipoPago(bk.getFacturaFormulario().getFormaPago().getNombre())) {
                    bk.getListaTipoPago().add(param.getValCadena());
                }
                if (bk.getFacturaFormulario().getFormaPago().getNombre().equalsIgnoreCase(Constantes.FormaPago.CREDITO)) {
                    bk.getFacturaFormulario().setFechVencimiento(bk.getFacturaFormulario().getFechDocventa());
                } else {
                    bk.getFacturaFormulario().setFechVencimiento(null);
                }
            }


        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }

    }

    public void actualizarEstado() {


        if (bk.getFacturaFormulario().getEstado() == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            bk.setEstado(COLOR_ESTADO_VENTA.ANULADO.getValor());
            bk.setColor(COLOR_ESTADO_VENTA.ANULADO.getColor());
        }
        if (bk.getFacturaFormulario().getEstado() == COLOR_ESTADO_VENTA.CREADA.getEstado()) {
            bk.setEstado(COLOR_ESTADO_VENTA.CREADA.getValor());
            bk.setColor(COLOR_ESTADO_VENTA.CREADA.getColor());
        }
        if (bk.getFacturaFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            bk.setEstado(COLOR_ESTADO_VENTA.EMITIDO.getValor());
            bk.setColor(COLOR_ESTADO_VENTA.EMITIDO.getColor());
        }
        if (bk.getFacturaFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA.getEstado()) {
            bk.setEstado(COLOR_ESTADO_VENTA.PAGADA.getValor());
            bk.setColor(COLOR_ESTADO_VENTA.PAGADA.getColor());
        }

        if (bk.getFacturaFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado()) {
            bk.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getValor());
            bk.setColor(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getColor());
        }
    }

    public boolean estaHabilitado(char estado) {
        if (estado == COLOR_ESTADO_VENTA.EMITIDO.getEstado() || estado == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            return true;
        } else {
            return false;
        }
    }

    public boolean porControlar(char estado, short control) {
        if (estado == COLOR_ESTADO_VENTA.EMITIDO.getEstado() && control == 1) {
            return true;
        } else {
            return false;
        }
    }

    public boolean estaEmitido(char estado) {
        if (estado == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void calcularTotales() {
        if (bk.getFacturaFormulario().getPrecioVenta() == null) {
            bk.getFacturaFormulario().setPrecioVenta(0.0);
        }
        bk.getFacturaFormulario().setTotalExportacion(
                bk.getFacturaFormulario().getPrecioVenta()
                + bk.getFacturaFormulario().getValorCFR()
                + bk.getFacturaFormulario().getValorCIF());

        convertirALetra();

    }

    public void actualizarFechas() {


        try {
            bk.getFacturaSeleccionado().setUsrModificacion(session.getUsuario().getUsuario());
            bk.getFacturaSeleccionado().setFecModificacion(new Date());

            servicioVentaFacturacion.actualizarVentaFacturacion(bk.getFacturaSeleccionado());

            //servicioArticulos.actualizarArticulo(articulo);
            mostrarMensaje("Se actualizó la Factura satisfactoriamente.");
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
}
